home *** CD-ROM | disk | FTP | other *** search
- /*
- ** TREE.H -- defines the structure of a querytree
- **
- ** Version:
- ** @(#)tree.h 8.2 4/13/85
- */
-
-
- # ifndef QT_HDR_SIZ
-
- # include <ingres.h>
-
-
- /*
- ** Structures Used In The Value Fields of Querytree nodes
- */
-
- /*
- ** STRKEEPER
- **
- ** This stores interval information for a char attribute
- ** type -- OPEN vs. CLOSED intervals
- ** strings -- the two delimiters
- ** flag -- 1st bit set if it is a special character
- ** 2nd bit set if backwards searching indicated
- ** number -- which occurance of strings to grab
- **
- */
-
- typedef struct strkeeper
- {
- char type[2];
- char *string[2];
- char flag[2];
- char number[2];
- } STRKEEPER;
-
- /*
- ** VAR node
- **
- ** This node type contains info for a tuple variable.
- ** varno -- index into range table
- ** attno -- attribute number in this relation
- ** varfrmt -- type of this domain
- ** varfrml -- length of this domain
- ** valptr -- pointer to value when bound.
- **
- ** If varno == -1, then this variable has been substituted; to
- ** get the actual VAR node, follow the chain of valptr's.
- */
-
- struct varnode
- {
- char varno; /* variable number */
- char attno; /* attribute number */
- char varfrmt; /* type */
- char varfrml; /* length */
- STRKEEPER *varstr; /* pointer to delimiter */
- ANYTYPE *valptr; /* pointer to value */
- };
-
-
- /*
- ** STRUCTURE FOR AND, AGHEAD, AND ROOT NODES
- **
- ** In the parser and qrymod none of these fields are used.
- ** Decomp maintains information about the variables
- ** in the left and right descendents of the nodes.
- ** The "rootuser" flag is present only in the ROOT and AGHEAD
- ** nodes. It is TRUE only in the original ROOT node of the query.
- */
-
- struct rootnode /* AND, AGHEAD, ROOT nodes */
- {
- char tvarc; /* total of var's in sub-tree */
- char lvarc; /* # of variables in left branch */
- short lvarm; /* bit map of var's in left branch */
- short rvarm; /* bit map of var's in right branch*/
- short rootuser; /* flag: TRUE if root of user generated query */
- };
-
- struct opnode /* AOP, BOP, UOP nodes */
- {
- short opno; /* operator number */
- char opfrmt; /* format of function */
- char opfrml; /* length of function */
- char agfrmt; /* in AOP, format of result */
- char agfrml; /* in AOP, length of result */
- };
-
- struct resdomnode /* RESDOM node */
- {
- short resno; /* result domain number */
- char resfrmt; /* result format */
- char resfrml; /* result length */
- };
-
-
- struct srcid /* SOURCEID node */
- {
- short srcvar; /* variable number */
- DESC srcdesc; /* descriptor for this var */
- };
-
-
- /*
- ** SYMVALUE UNION
- **
- ** This union contains all of the types available
- ** in the value field of a querytree node.
- */
-
- union symvalue
- {
- union anytype sym_data;
- struct varnode sym_var;
- struct rootnode sym_root;
- struct opnode sym_op;
- struct resdomnode sym_resdom;
- struct srcid sym_srcid;
- };
-
-
- /*
- ** SYMBOL DEFINITION
- **
- ** Basic symbol structure. "Type" is one of the symbols
- ** in "symbol.h", "len" is the length of the "value"
- ** field (0 to 255 bytes), "value" is variable length and
- ** holds the actual value (if len != 0) of the node.
- ** The "value" is one of the types contained in "union symvalue".
- **
- ** On a thirty-two bit machine, there are two bytes of padding
- ** after type and length. These two bytes are discarded
- ** when a symbol is written to a pipe.
- **
- ** SYMOFF should be set to the number of bytes between
- ** the start to this structure and where the value field starts
- */
-
- #define SYMOFF 4
-
- struct symbol
- {
- char type; /* type codes in symbol.h */
- char len; /* length in bytes of value field */
- union symvalue value;
- int start; /* start of string if char */
- };
-
- typedef struct symbol SYMBOL;
-
-
- /*
- ** QUERYTREE NODE
- **
- ** Basic node in the querytree. Each node has a left and
- ** right descendent. If the node is a leaf node then the
- ** left and right pointers will be NULL. Depending on the
- ** "type" field of the symbol structure, there may be additional
- ** information.
- */
-
- struct querytree
- {
- struct querytree *left;
- struct querytree *right;
- struct symbol sym;
- };
-
- typedef struct querytree QTREE;
-
-
- /*
- ** SUNDRY CONSTANTS
- **
- ** There are several differences in the handling of data
- ** structures on 16 and 32 bit machines:
- ** 1). A pointer to memory is either 2 or 4 bytes.
- ** 2). Padding is inserted in structures to insure
- ** alignment of 16 and 32 bit numbers.
- **
- ** For these reasons the following constant definitions
- ** are useful for machine independent allocation.
- **
- ** These are based on the PDP11 compile flag.
- **
- ** QT_HDR_SIZ -- size of left and right pointers, typ,
- ** len and padding
- ** SYM_HDR_SIZ -- size of type and len in symbol
- ** structure -- includes any padding before
- ** the value field
- ** TYP_LEN_SIZ -- size of type and len in symbol
- ** structure -- without padding
- **
- ** INGRES FOLKS: don't change these back to sizeof's!!!
- ** The PDP-11 compiler doesn't understand!
- */
-
- # ifdef PDP11
- # define QT_HDR_SIZ 6
- # define SYM_HDR_SIZ 2
- # define TYP_LEN_SIZ 2
- # else
- # define QT_HDR_SIZ 12
- # define SYM_HDR_SIZ 4
- # define TYP_LEN_SIZ 2
-
-
-
-
- # endif PDP11
-
-
-
-
-
- /*
- ** Query Tree Header.
- **
- ** Qt_ctx should be of type 'ctx_t *', but it is 'char *'
- ** to insure that we don't need ctlmod.h.
- */
-
- struct qthdr
- {
- char qt_active; /* if set, Qt area is in use */
- char *qt_ctx; /* pointer to context */
- short qt_qmode; /* query mode */
- short qt_resvar; /* result variable number */
- RANGEV qt_rangev[MAXRANGE]; /* the range table */
- short qt_remap[MAXRANGE]; /* variable remapping (for QM) */
- } Qt;
-
-
- # endif QT_HDR_SIZ
-